import http from '@/utils/request'
// import { AppDispatch } from '..'
import store, { AppDispatch } from '..'
/**
 * 获取文章新闻推荐
 * @param channel_id 频道ID
 * @param timestamp  时间戳，请求新的推荐数据传当前的时间戳，请求历史推荐传指定的时间戳
 * @returns {Promise} Promise<void>
 */
export const getArticles = ({ channel_id = 0, timestamp = Date.now(),isRefresh = false }) => {
  return async (dispatch: AppDispatch) => {
    const res = await http.get(`/v1_0/articles`, { params: { channel_id, timestamp } })
    console.log(`/v1_0/articles`, res)
        // 先获取原本的 articles 对象的数据
        const { articles } = store.getState().article
    // dispatch({
    //     type:"article/saveArticles",
    //     payload:{
    //            // 展开原本的频道新闻数据
    //     ...articles,
    //     // 再追加新的频道新闻数据
    //         [channel_id]:{
    //             timestamp,
    //             list:res.data.results
    //         }
    //     }
    // })
    // 🔔获取当前频道的新闻列表，可能获取到 undefined 或者 新闻数组[]
    const list = articles[channel_id]?.list
    const pre_timestamp = res.data.pre_timestamp
    if (!list|| isRefresh) {
         // 🔔 情况1：如果没有列表，就直接存
         dispatch({
                type:"article/saveArticles",
                payload:{
                       // 展开原本的频道新闻数据
                ...articles,
                // 再追加新的频道新闻数据
                    [channel_id]:{
                        // timestamp,
                         // 需要把后端返回的时间戳存起来，用于分页请求，防止出现重复的推荐
                         timestamp: pre_timestamp,
                        list:res.data.results
                    }
                }
            })
    }else{
          // 🔔 情况2：如果有列表，需要把新，旧两份数组拼接在一起
          dispatch({
            type: 'article/saveArticles',
            payload: {
                ...articles,
                [channel_id]: {
                //   timestamp,
                 // 需要把后端返回的时间戳存起来，用于分页请求，防止出现重复的推荐
                  timestamp: pre_timestamp,
                  list: [...list, ...res.data.results],
                },
              },
          })
    }
    if (!pre_timestamp) {
        return Promise.reject('没有推荐了')
      }
  }
}

/**
 * 文章标记 -  文章不感兴趣和举报
 * @param visible     用于控制标记弹窗的显示与隐藏
 * @param article_id  需要标记的文章 id
 * @returns
 */
 export const setArticleMark = ({ visible = false, article_id = '' }) => {
    return async (dispatch: AppDispatch) => {
      dispatch({ type: 'article/setMark', payload: { visible, article_id } })
    }
  }

  /**
 * 文章标记为不喜欢
 * @param target   不喜欢的文章id
 * @returns
 */
export const setArticleDislikes = (target: string) => {
  return async (dispatch: AppDispatch) => {
    // 发送请求让后端更新文章的标记为不喜欢
    const res = await http.post(`/v1_0/article/dislikes`, { target })
    console.log(`/v1_0/article/dislikes`, res)
    // 从 redux 把当前文章删除
      // 获取当前频道 id
      const activeId = store.getState().channel.activeId
      // // 根据频道 id 获取文章列表
      const articles = store.getState().article.articles
      // const { channel: { activeId }, article: { articles } } = store.getState()
      // 根据频道 id 获取文章列表
      const { list, timestamp } = articles[activeId]
      // console.log({ list, timestamp })
      dispatch({
        type: 'article/saveArticles',
        payload: {
          // 保留其他频道的数据
          ...articles,
          // 当前频道的不喜欢的那条文章过滤掉
          [activeId]: {
            timestamp,
            list: list.filter((v) => v.art_id !== target),
          },
        },
      })
  }
}
/**
 * 举报文章
 * @param target   不喜欢的文章id
 * @param type     举报类型： 0-其他问题，1-标题夸张，2-低俗色情，3-错别字多，4-旧闻重复，5-广告软文，6-内容不实，7-涉嫌违法犯罪，8-侵权'
 * @param remark   其他问题 的附加说明
 * @returns
 */
 export const setArticleReports = ({ target = '', type = '0', remark = '' }) => {
  return async (dispatch: AppDispatch) => {
    // 发送请求让后端更新文章的标记为不喜欢
    // const res = await http.post(`/v1_0/article/reports`, { target, type, remark })
    // console.log(`/v1_0/article/reports`, res)
    const res = await http.post(`/v1_0/article/reports`, {
      target,
      type,
      remark,
    });
    console.log(`/v1_0/article/reports`, res);
    // 从 redux 把当前文章删除
    // 获取当前频道 id
    const activeId = store.getState().channel.activeId
    // // 根据频道 id 获取文章列表
    const articles = store.getState().article.articles
    // const { channel: { activeId }, article: { articles } } = store.getState()
    // 根据频道 id 获取文章列表
    const { list, timestamp } = articles[activeId]
    // console.log({ list, timestamp })
    dispatch({
      type: 'article/saveArticles',
      payload: {
        // 保留其他频道的数据
        ...articles,
        // 当前频道的不喜欢的那条文章过滤掉
        [activeId]: {
          timestamp,
          list: list.filter((v) => v.art_id !== target),
        },
      },
    })
  }
}

/**
 * 获取新闻详情
 * @param article_id 文章id
 * @returns
 */
 export const getArticleDetail = (article_id: string) => {
  return async (dispatch: AppDispatch) => {
    const res = await http.get(`/v1_0/articles/${article_id}`);
    console.log(163,`/v1_0/articles/${article_id}`, res);
    dispatch({ type: 'article/saveDetail', payload: res.data })
  };
};

/**
 * 点赞和取消点赞
 * @param target 文章id
 * @returns
 */
 export const changeArticleLikings = (target: string) => {
  return async (dispatch: AppDispatch) => {
    // 	用户对文章的态度, -1: 无态度，0-不喜欢，1-点赞
    const { detail } = store.getState().article
    if (detail.attitude !== 1) {
      // 情况1：点赞
      await http.post(`/v1_0/article/likings`, { target })
      // console.log(res)
      // dispatch({ type: 'article/saveDetail', payload: { ...detail, attitude: 1 } })
      dispatch({
        type: 'article/changeDetail',
        payload: { like_count: detail.like_count + 1, attitude: 1 },
      })
    } else {
      // 情况2：取消点赞
      await http.delete(`/v1_0/article/likings/${target}`)
      // console.log(res)
      // dispatch({ type: 'article/saveDetail', payload: { ...detail, attitude: -1 } })
      dispatch({
        type: 'article/changeDetail',
        payload: { like_count: detail.like_count - 1, attitude: -1 },
      })
    }
  }
}


/**
 * 收藏文章和取消收藏
 * @param target 文章id
 * @returns
 */
 export const changeArticleCollections = (target: string) => {
  return async (dispatch: AppDispatch) => {
    // 	用户对文章的态度, -1: 无态度，0-不喜欢，1-点赞
    const { detail } = store.getState().article
    if (detail.is_collected === false) {
      // 情况1：收藏文章
      await http.post(`/v1_0/article/collections`, { target })
    } else {
      // 情况2：取消收藏
      await http.delete(`/v1_0/article/collections/${target}`)
    }
    const is_collected = !detail.is_collected
    dispatch({
      type: 'article/changeDetail',
      payload: { is_collected },
    })
  }
}